#include <bits/stdc++.h>

using namespace std;

struct Node{
	int l=0,r=0;
	int s=0;
	int lazy=0;
};

class SegmentTree{
public:
	vector<Node> t;
	explicit SegmentTree(int n){
		t.resize(4*n);
	}
	~SegmentTree()= default;

	void pushup(int i){
		t[i].s=t[2*i].s+t[2*i+1].s;
	}

	void pushdown(int i){
		if(t[i].lazy){
			t[2*i].lazy+=t[i].lazy;
			t[2*i].s+=t[i].lazy*(t[2*i].r-t[2*i].l+1);
			t[2*i+1].lazy+=t[i].lazy;
			t[2*i+1].s+=t[i].lazy*(t[2*i+1].r-t[2*i+1].l+1);
			t[i].lazy=0;
		}
	}

	void build(int i,int l,int r,vector<int>&a){
		t[i].l=l;
		t[i].r=r;
		if(l==r){
			t[i].s=a[l];
			return;
		}
		int mid=l+(r-l)/2;
		build(i*2,l,mid,a);
		build(i*2+1,mid+1,r,a);
		pushup(i);
	}

	int query(int i,int l,int r){
		if(t[i].l>r||t[i].r<l) return 0;
		if(t[i].l>=l&&t[i].r<=r){
			return t[i].s;
		}
		pushdown(i);
		return query(2*i,l,r)+query(2*i+1,l,r);
	}

	int query(int l,int r){
		return query(1,l,r);
	}

	void update(int i,int l,int r,int v){
		if(t[i].l>r||t[i].r<l) return ;
		if(t[i].l>=l&&t[i].r<=r){
			t[i].lazy+=v;
			t[i].s+=v*(t[i].r-t[i].l+1);
			return;
		}
		pushdown(i);
		update(2*i,l,r,v);
		update(2*i+1,l,r,v);
		pushup(i);
	}

	void update(int l,int r,int v){
		update(1,l,r,v);
	}
};

int main(){
	vector<int> a{0,1,3,6,-1,3,8};
	SegmentTree seg(a.size());
	seg.build(1,0,a.size()-1,a);
	cout<<seg.query(0,3)<<endl;
	seg.update(1,2,5);
	cout<<seg.query(0,3)<<endl;
	return 0;
}